Virtualization is a computing trend that abstracts hardware to allow multiple workloads to share a common set of resources. Virtualization permits executing multiple environments on a single computer system. The multiple environments are called virtual machines. On shared virtualized hardware, a variety of workloads can co-locate while maintaining full isolation from each other, can freely migrate across infrastructures, and can scale as needed. The single computer system that is supporting the multiple virtual machines is generally referred to as the host machine. Each of the virtual machines is generally referred to as a guest machine. The host machine is generally connected to a system network or bus, over which data to be serviced by a system resource will travel. In most systems, data containing data packets that are intended for one of the virtual machines are received from a system bus or network over a Network Interface Card (NIC), then are sent to the host, and then sent to the virtual machine.
The virtual machines (VM's) may execute their own workload, but they still generally must share resources of the host machine. The shared resources of the host machine may include, for example, memory or external data storage or input/output facilities. The operation of the shared resources must be managed so that each of the VM's in the system can obtain access to the resource so their respective service requests may be executed, or processed. As each of the VM's sends or receives data with respect to an associated host machine resource, each of the sending VM's will need to obtain exclusive use of the resource, even if only for a limited time. The processing of data packets coming to and from the VM's for purposes of utilizing shared resources can create performance bottlenecks, such as data traffic problems in the host machine. Such data traffic problems may devolve into problems referred to as deadlock and livelock. In each of these data lock situations, a shared resource may be unable to communicate with VM's that require its functions, either because the state of the resource may be locked in a busy state (deadlock), or the state of the VM's may have become unstable and are constantly changing (livelock).
Solutions to the problem of deadlock and livelock have been proposed. Such solutions include, for example, data input/output (I/O) virtualization features that facilitate offloading of multi-core packet processing to network adapters, as well as direct assignment of virtual machines to virtual functions, including disk I/O. Examples of the proposed systems include Virtual Machine Device Queues (VMDQ), Single Root I/O Virtualization (SR-IOV, also a PCI-SIG standard), and the like.
Unfortunately, some solutions to deadlock and livelock shift the performance bottleneck of VM's from one system location to another. The processing demanded of the VM's for handling data packets in need of service by system resources is still a performance bottleneck. For example, in some VM systems, on packet arrival, the NIC interrupts the CPU core which handles incoming packets. The packet is copied into the memory space of the target VM and an interrupt is generated for the target VM for handing the packet. If packet buffers are not available in the user address space, additional buffer copying may be needed. If target VMs are serving high bandwidth connections, the VM system may not be able to keep up with incoming packets and may run into a receive livelock scenario.